package com.shujia.core

import org.apache.spark.rdd.RDD
import org.apache.spark.util.LongAccumulator
import org.apache.spark.{SparkConf, SparkContext}

import scala.collection.mutable.ListBuffer

object Demo18ACC {
  def main(args: Array[String]): Unit = {
    /**
     * 累加器
     */
    // 构建Spark上下文环境
    val conf: SparkConf = new SparkConf()
    conf.setAppName("Demo18ACC")
    conf.setMaster("local")
    val sc: SparkContext = new SparkContext(conf)

    var i: Int = 1
    // 1、读取students、scores数据
    val stuRDD: RDD[String] = sc.textFile("Spark/data/stu/students.txt")

    // 如果想要在算子内部，对外部的变量进行累加，需要使用累加器
    // 在算子外部（Driver端）定义一个累加器
    val acc: LongAccumulator = sc.longAccumulator

    val lb: ListBuffer[String] = ListBuffer[String]()

    stuRDD.foreach(line => {
      //      i += 1
      //      lb.append(line) // 算子内部无法直接对算子外部定义的变量进行修改 修改的实际上都是副本
      //      println(i)
      //      println(line)
      // 在算子内部使用
      acc.add(1)
    })
    //    println("i的值是 " + i)
    // 在Driver进行汇总(自动汇总)
    println(acc.value)


  }

}
